package servlet.ann.config;

import servlet.ann.servlet.AnnServlet;
import servlet.ann.servlet.UserServlet;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.HandlesTypes;
import java.util.Set;

/**
 * 容器启动的时候会将 @HandlesTypes 指定的这个类型下面的子类（实现类，子接口等）传递过来
 * 传入感兴趣的类型，即想要 Set<Class<?>> c 传入的类型
 */
@HandlesTypes({AnnServlet.class})
public class ServletForServletContainerInitializer implements ServletContainerInitializer {

    /**
     * 应用启动的时候，会运行 onStartup 方法；
     * <p>
     * Set<Class<?>> arg0：感兴趣的类型的所有子类型；
     * ServletContext arg1:代表当前 Web 应用的 ServletContext；一个 Web 应用一个 ServletContext；
     * <p>
     * 1）、使用 ServletContext 注册 Web 组件（Servlet、Filter、Listener）
     * 2）、使用编码的方式，在项目启动的时候给 ServletContext 里面添加组件；
     * 必须在项目启动的时候来添加；
     * 1）、ServletContainerInitializer 得到的 ServletContext；
     * 2）、ServletContextListener 得到的 ServletContext；
     */
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        // 添加servlet，设置映射
        // ServletRegistration.Dynamic hello = ctx.addServlet("hello", AnnServlet.class);
        // hello.addMapping("/hello");

        ServletRegistration.Dynamic user = ctx.addServlet("user", new UserServlet());
        user.addMapping("/user", "/userx");

        // 异步 Servlet 请求
        // ServletRegistration.Dynamic async = ctx.addServlet("async", AsyncServlet.class);
        // async.setAsyncSupported(true);
        // async.addMapping("/async");
    }
}
